home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacHack 1996
/
MacHack 1996.toast
/
Presentations
/
Presentations ’94
/
Timothy Knox
/
Pocket6.3
/
Source
/
Dictionary.txt
< prev
next >
Wrap
Text File
|
1994-06-24
|
46KB
|
1,910 lines
; this file is: Dictionary.txt -- forth words
; Tue Apr 05, 1988 21:59:10 load files >32K
; Thu Apr 07, 1988 15:59:46 nested loads
; Tue Apr 19, 1988 05:05:37 change "?BUTTON"
; Mon Apr 25, 1988 15:10:19 implement macros
; Tue Apr 26, 1988 19:49:49 optomizing "BACK"
; Thu Apr 28, 1988 23:09:23 fix ID. better CONSTANT,2CONSTANT add zero
; Fri Apr 29, 1988 09:43:49 add DLITERAL
; Sun May 01, 1988 04:24:52 make VARIABLE a macro
; Thu May 12, 1988 11:41:08 remove (PDO) add 1- 2- & SP@ use slashFail
; Sun May 29, 1988 20:16:39 make CREATE shorter
; Tue May 31, 1988 14:27:25 make +MD a 4 byte macro remove 2-
; Tue Jun 07, 1988 11:39:00 add R0@, S0@, RP@ redo STOD
; Sun Jun 23, 1991 09:33:00 add OPEN
; Thu Jan 13, 1992 19:05:00 Floating point math (rewrite 13Apr)
; Sun Feb 02, 1992 00:02:00 fix BACK
; Wed Apr 01, 1992 00:12:00 change STKCHK
; Tue Apr 14, 1992 22:48:00 rearrange to bring essentials toward front
; Sun Apr 19, 1992 23:24:00 split open into 2 parts, add AE: ;AE> ?GESTALT
; Sat Sep 19, 1992 17:05:00 fix FROLL in decimal places 15-19
; Fri Jan 22, 1993 19:28:00 fix TYPE
; Mon Apr 19, 1993 22:58:00 move ?BUTTON and FLITERAL
; Thu May 06, 1993 23:04:00 fix +LOOP and QUIT
; Sat May 29, 1993 15:20:00 fix TYPE (again)
; Tue Jun 01, 1993 23:25:00 add WARM, DEPTH
; Wed Jun 09, 1993 20:17:00 change IMMEDIATE,PAGE,doLoad,header,dictstart
DictStart:
DC.L 0 ; End of dictionary search
DC.B 128+1,13,0,0 ; "{cr}" ( -- ) goto restart
DC.W dictstart-base
CRet: MOVE.L rzero-base(bp),rs ; reset return stack
JMP Restart-base(BP) ; and jump
DC.B 128+1,0,0,0 ; "{null}" ( -- ) same as cret
DC.W cret-theLink
NRet: BRA.S cret
DC.B 128+1,'\',0,0 ; "\" ( -- ) backslash
DC.W nret-theLink ; line ending comment
Backsl: bra.s cret
DC.B 9,'?TE' ; "?terminal" ( -- flag )
DC.W backsl -theLink ; was a key pressed?
QTerm: JSR NextEvent-base(BP)
CLR -(PS)
TST kflag-base(BP)
BEQ.S @0
SUBQ #1,(PS)
@0: RTS
DC.B 3,'KEY' ; "key" ( -- ascii )
DC.W qterm-theLink ; wait for a key press
Key: BSR.S Curs
@0: JSR NextEvent-base(BP) ; set kflag if a key is pressed
TST KFlag-base(BP) ; ( among other things... )
BEQ.S @0
BSR.S NoCurs
MOVE KFlag-base(BP),-(PS)
RTS
NoCurs: MOVE #10,-(SP) ; SrcXor mode
_PenMode
Curs: clr.l -(sp)
addq.l #6,(sp)
_Move
MOVE.L #$0000FFFA,-(SP) ; draw 6 pixels to the left
_Line
_PenNormal
RTS
DC.B 6,'?ST' ; "?stack" ( ? -- )
DC.W key-theLink
StkChk: CMPA.L Szero-base(BP),PS
BGT.S @0
RTS
@0: JSR space-base(BP)
MOVEQ #42,D0 ; print * if stack underflow
JSR EmitCode-base(BP)
BRA.S huh
DC.B 7,'?BU' ; "?button" ( -- flag )
DC.W StkChk-theLink
QButton:
CLR -(SP)
_Button
MOVE (SP)+,-(PS)
BEQ.S @0
SUBI #257,(PS)
@0: RTS
DC.B 6,'WHA' ; "whazat" ( -- )
DC.W QButton-theLink
WhaZat: jsr dwrd-base(bp) ; push token address
BRA.S huh
DC.B 5,'ABO' ; "abort" ( -- )
DC.W whazat-theLink
huh: MOVE.L Szero-base(BP),PS ; reset stack pointer < moved 5/93
MOVEQ #63,D0 ; send ?
JSR EmitCode-base(BP)
BSR.S crlf
BRA.S fin
DC.B 4,'QUI' ; "quit" ( -- )
DC.W huh-theLink ; restart the interpreter loop
fin: JSR emptyfs-base(BP) ; clear pending loads
CLR.L fcolon-base(BP) ; clear compiling flag
BSET.B #7,fint-base(BP) ; reset to keyboard input
JMP cret-base(BP)
DC.B 2,'CR',0 ; "cr" ( -- ) output CR to screen
DC.W fin-theLink
CRLF: JMP doCR-Base(BP) ; part of emit
DC.B 3,'.OK' ; ".ok" ( -- )
DC.W crlf-theLink
Prompt: JSR space-base(BP) ; send space
MOVEQ #111,D0
JSR EmitCode-base(BP) ; send "o"
MOVEQ #107,D0
JSR EmitCode-base(BP) ; send "k"
JMP space-base(BP) ; send another space & return
DC.B 5,'UPP' ; "upper" ( addr -- )
DC.W prompt-theLink ; change a string to upper case
Upper: MOVE (PS)+,D0
LEA 0(BP,D0.W),A0 ; get the address
CLR D0
MOVE.B (A0),D0 ; get count
@0: CMPI.B #$60,0(A0,D0.W) ; BEGIN get char at addr + count
BLE.S @1 ; char > 'a'
CMPI.B #$7B,0(A0,D0.W) ; char < 'z'
BGE.S @1 ; AND IF
SUBI.B #32,0(A0,D0.W) ; char 32 - -> char THEN
@1: DBRA D0,@0 ; count 1- -> count count NOT UNTIL
RTS
DC.B 5,'TOK' ; "token" ( -- ) put a token
DC.W upper-theLink ; from (IS) into (DP),
Token: MOVE #32,-(PS) ; which is at end of dict.
BSR.S word
JSR here-base(BP) ; Fri Apr 29, 1988 00:27:23 simpl
BRA.S Upper
DC.B 6,'HEA' ; "header" ( -- ) create a header
DC.W token-theLink ; for the current word at DP
Header: MOVE Dict,4(DP) ; link header to dictionary
MOVE.L DP,Dict ; update DICT
SUB.L BP,Dict ; make it a rel.addr
addq.l #6,dp ; update DP
RTS
DC.B 4,'WOR' ; "word" ( c -- ) c is delimiter
DC.W header-theLink ; get chars from (IS) into HERE
Word: MOVE.L D4,-(SP) ; preserve the register
MOVE (PS)+,D4 ; get delimiter character
CLR.L (DP) ; clear token buffer
CLR.L D1 ; clear count
@0: MOVE.B (IS)+,D0 ; get characters until delimiter
CMP.B D4,D0
BEQ.S @1
MOVE.B D0,1(DP,D1) ; place in token buffer
ADDQ.B #1,D1 ; increment count
BRA.S @0
@1: MOVE.B D1,(DP) ; put count in 1st byte of buffer
BEQ.S @0 ; if count is 0 repeat
MOVE.L (SP)+,D4 ; restore the register
RTS
DC.B 1,'''',0,0 ; "'" ( -- rel.addr ) return the
DC.W word-theLink ; cfa of the following word
Tick: bsr.s token ; get the next word
MOVE Dict,-(PS) ; push dict ptr to parmstk
bsr.s search ; lookup the current token
TST (PS)+
BEQ Whazat
RTS
DC.B 6,'SEA' ; "search" ( addr -- cfa t OR f )
DC.W tick-theLink
Search: MOVE.L (DP),D1 ; put token "stem" in D1
MOVE (PS),D0 ; use A0 as search pointer
CLR fmacro-base(BP) ; clear the macro flag
@0: LEA 0(BP,D0.W),A0 ; DO
TST (A0) ; IF DictStart exit NOFIND
BEQ.S nofind
CMP.L (A0),D1 ; compare word to candidate
BEQ.S find ; IF found, exit FIND
BCHG #31,D1 ; set immediate bit
CMP.L (A0),D1 ; compare to "immediate" version
BEQ.S ifind ; IF found, exit IFIND
BCHG #31,D1 ; reset immediate bit
BCHG #30,D1 ; set macro bit
CMP.L (A0),D1 ; compare to "macro" version
BEQ.S mfind ; IF found, exit MFIND
BCHG #30,D1 ; reset macro bit
MOVE 4(A0),D0 ; get link rel.address
BRA.S @0 ; LOOP
nofind: CLR (PS) ; push fail flag
RTS
mfind: BSET.B #7,fmacro-base(BP) ; set macro flag
BRA.S find
ifind: BSET.B #7,fimmed-base(BP) ; set immediate flag
find: LEA 6(A0),A0 ; cfa is at 6+nfa
SUBA.L BP,A0 ; convert code address to relative
MOVE A0,(PS) ; push code rel address
MOVE #-1,-(PS) ; push success flag
RTS
DC.B 6,'NUM' ; "number" ( addr -- n t OR f )
DC.W search-theLink
Number: MOVE.L D4,-(SP) ; save the register
CLR.L D1
CLR.L D4 ; clear conversion register
MOVE (PS)+,D0 ; get token addr in D0
LEA 0(BP,D0.W),A0 ; put abs.addr in A0
CMPI.B #'-',1(A0) ; is it negative?
BNE.S @0 ; IF yes
BSET.B #7,fneg-base(BP) ; set negative flag
MOVE.B #'0',1(A0) ; change dash to zero
@0: CLR.L D0 ; THEN
MOVE.B (A0)+,D1 ; get digit count
digit: MOVE.B (A0)+,D0 ; BEGIN get next digit
SUBI.B #48,D0 ; strip ASCII prefix
BLT.S @2 ; if digit too small, FAIL
CMP #10,D0 ; if digit > 9
BLT.S @1 ; adjust for radix>10 values
SUBI.B #7,D0 ; and test again
CMP #10,D0
BLT.S @2
@1: CMP NBase-base(BP),D0 ; if base < digit
BGE.S @2 ; FAIL
MULU NBase-base(BP),D4 ; multiply value by base
ADD D0,D4 ; add current digit
SUBQ.B #1,D1 ; decrement count
BNE.S digit ; UNTIL no digits remain
BCLR #7,fneg-base(BP) ; test and clear negative flag
BEQ.S @0 ; if set
NEG D4 ; Negate it
@0: MOVE D4,-(PS) ; push number
MOVE #-1,-(PS) ; push success flag
BRA.S @3
@2: CLR -(PS) ; push fail flag
@3: MOVE.L (SP)+,D4 ; restore the register
RTS
DC.B 7,'FNU' ; FNUMBER ( dabs.addr -- f )
DC.W number-theLink ; convert string at dabs.addr to fp
fnum: MOVE.L (PS)+,-(RS)
MOVE #1,-(PS)
PEA (PS)
PEA $14(DP)
CLR -(PS)
PEA (PS)
FPSTR2DEC
ADDQ.L #4,PS
CMPI #$054E,24(DP) ; check for NAN##
BNE.S @0
; move whaError-base(bp),d0 ; vector error 6/1/93
; jmp 0(bp,d0.w)
JMP whazat-base(BP)
@0: PEA $14(DP)
SUBQ.L #6,PS
SUBQ.L #4,PS
PEA (PS)
FDEC2X
RTS
DC.B 7,'EXE' ; "execute" ( cfa -- ) do a routine
DC.W fnum-theLink ; whose cfa is on the stack
EXECUTE MOVE (PS)+,D0 ; pop code address
JMP 0(BP,D0.W) ; execute & return
DC.B 8,'MCO' ; "mcompile" ( cfa -- )
DC.W Execute-theLink ; compile subroutine bodies inline
MComp: MOVE (PS)+,D0
LEA 0(BP,D0.W),A0 ; addr of word
@0: MOVE (A0)+,D0
CMPI #$4E75,D0 ; if its an RTS your done
BEQ.S @1
MOVE D0,(A2)+ ; if not, compile it
BRA.S @0 ; do next word
@1: RTS
DC.B 128+9,'[CO' ; "[compile]" ( -- ) compile
DC.W mcomp-theLink ; the next immediate word
bCompile:
JSR tick-base(BP) ; get the cfa of the next word
bra.s compile ; and compile a JSR to it
DC.B 7,'COM' ; "compile" ( cfa -- ) compile a
DC.W bcompile-theLink ; call to the cfa on the stack
COMPILE MOVE #$04EAB,(DP)+ ; compile "JSR d(A3)"
BRA.S Comma ; compile displacement value
DC.B 9,'IMM' ; "immediate" ( -- ) make the last
DC.W compile-theLink ; word defined immediate
IMMED BSET #7,0(BP,Dict.W) ; set immediate bit of most recent word
RTS
DC.B 5,'MAC' ; "macro" ( -- ) make the last
DC.W immed-theLink ; word defined an inline macro
marco: BSET #6,0(BP,Dict.W) ; set macro bit of most recent word
RTS
DC.B 1,':',0,0 ; ":" ( -- ) make a header for a
DC.W marco-theLink ; word definition
COLON JSR token-Base(BP) ; make header
JSR header-base(BP)
BRA.S rbrack ; enter compile mode
DC.B 129,']',0,0 ; "]" ( -- ) enter compile mode
DC.W colon-theLink
rBrack: BSET #7,fcolon-base(BP) ; set colon flag
RTS
DC.B 129,';',0,0 ; ";" ( -- ) end a word definition
DC.W rBrack-theLink
SEMI MOVE #$4E75,(DP)+ ; compile "RTS"
BRA.S lbrack
DC.B 129,'[',0,0 ; "[" ( -- ) leave compile mode
DC.W semi-theLink
lBrack: CLR.B fcolon-base(BP) ; clear colon flag
RTS
DC.B 7,'LIT' ; "literal" compiling: ( n -- )
DC.W lBrack-theLink ; executing: ( -- n )
LITERAL MOVE #$03D3C,(DP)+ ; compile move #xxxx,-(PS)
BRA.S Comma ; compile constant
DC.B 64+1,',',0,0 ; "," ( n -- )
DC.W literal-theLink
COMMA MOVE (PS)+,(DP)+ ; pop number to dictionary
RTS
DC.B 8,'FLI' ; FLITERAL ( comp: n5 n4 n3 n2 n1 -- |exec: -- n5 n4 n3 n2 n1 )
DC.W comma-theLink
flit: MOVE (PS),D0
MOVE 2(PS),D1
MOVE 8(PS),(PS)
MOVE 6(PS),2(PS)
MOVE D0,8(PS)
MOVE D1,6(PS)
MOVEQ #4,D0
@0: bsr.s literal
DBRA D0,@0
RTS
DC.B 128+2,',$',0 ; ",$" ( -- )
DC.W flit-theLink ; compile a hex number from input
CommaH: MOVE NBase-base(BP),-(RS)
MOVE #$10,nbase-base(BP)
JSR token-base(BP)
BSR.S here
JSR number-base(BP)
MOVE (RS)+,nbase-base(BP)
TST (PS)+
BEQ whazat
BRA.S comma
DC.B 4,'HER' ; "here" ( -- addr )
DC.W commah-theLink ; rel.addr of compile point
here: MOVE.L DP,-(PS)
BRA.S torel
DC.B 8,'DLI' ; "dliteral" compiling: ( d -- )
DC.W here-theLink ; executing: ( -- d )
DLit: MOVE #$2D3C,(DP)+ ; compile move.l #xxxx,-(PS)
MOVE.L (PS)+,(DP)+ ; compile double number
RTS
DC.B 4,'>RE' ; ">rel" (to-rel) ( rel.uu) (rel.ah)
DC.W dlit-theLink ; ( daddr32 -- addr16 )
toRel: MOVE.L (PS)+,D0 ; get the Daddr32 from stack
SUB.L BP,D0 ; get difference from base addr
MOVE D0,-(PS) ; push the 16 bit part of it
RTS
DC.B 5,'COU' ; "count" ( addr -- addr+1 length )
DC.W torel-theLink
Count: CLR D1
MOVE (PS),D0
MOVE.B 0(BP,D0.W),D1
ADDQ #1,(PS)
MOVE D1,-(PS)
RTS
DC.B 64+3,'+MD' ; "+MD" ( offset -- addr )
DC.W count-theLink
MacDat: ADDI #theWindow-base,(PS) ; add data addr to stacked offset
RTS
DC.B 4,'PAG' ; "page" ( -- )
DC.W macdat-theLink ; clear the window
Page: PEA WContRect-base(BP) ; The visable part of the window.
_EraseRect
MOVE.l #$90001,-(SP)
_MoveTo ; set pen position to home (1,9)
_PenNormal ; 1X1, black, patcopy
MOVE.l #$40000,-(SP)
_TextFont ; Monaco
_TextFace ; plain text
MOVE.l #$90000,-(SP)
_TextSize ; 9 point
_TextMode ; srcCopy
RTS
DC.B 4,'BEE' ; "beep" ( -- )
DC.W page-theLink
Beep: MOVE.W #3,-(SP)
_SysBeep
RTS
DC.B 64+3,'MON' ; "mon" ( -- ) execute _Debugger
DC.W beep-theLink
Mon: _DeBugger
RTS
DC.B 3,'BYE' ; "bye" ( -- ) set quit flag
DC.W mon-theLink
Bye: ADDQ #1,doneFlag-base(BP)
RTS
TexD: DC.W 'TEXT'
DC.B 4,'OPE' ; "open" ( -- vrefnum )
DC.W bye-theLink
Open: MOVE.L #$4B0037,-(SP) ; point: 75,55
CLR.L -(SP) ; no prompt
CLR.L -(SP) ; no filter
MOVE #1,-(SP) ; 1 type
PEA texd-base(BP)
CLR.L -(SP) ; no hook
PEA (A2) ; put sfreply at here
MOVE #2,-(SP)
_Pack3 ; _sfreply
TST (A2) ; check 'good' field
BEQ.S beep ; beep if cancel
MOVE 6(A2),-(PS) ; hold the vrefnum on stack ***
CLR D0
@0: MOVE.L 10(A2,D0.W),40(A2,D0.W) ; move the file name to PAD
ADDQ #4,D0
CMP #32,D0
BLE.S @0
ADDQ #1,openFlag-base(BP)
RTS
DC.B 3,'-->' ; "-->" ( -- )
DC.W open-theLink
Load: JSR token-base(BP) ; put filename string at HERE
CLR -(PS) ; set vrefnum to 0 (path is specified)
BRA.S load1
doLoad:
lea 40(a2),a0 ; Move the file name from PAD to HERE
move.l a2,a1
moveq #32,d0
_blockmove
; CLR D0 ; Move the file name from PAD to HERE
; @0: MOVE.L 40(A2,D0.W),0(A2,D0.W) ;
; ADDQ #4,D0 ;
; CMP #32,D0 ;
; BLE.S @0
load1: MOVE fsptr-base(BP),D0 ; get file stack pointer
BMI.S @1 ; ... save the offset into text ...
LEA fofsets-base(BP),A0 ; ... at fofsets+fspointer
MOVE.L TextO-base(BP),0(A0,D0.W)
LEA fends-base(BP),A0 ; TextE at fends+fspointer
MOVE.L TextE-base(BP),0(A0,D0.W)
@1: ADDQ #4,fsptr-base(BP) ; increment the file stack pointer
MOVE.L #80,D0 ; create an 80 byte block for
_NewPtr.CLEAR ; make the file control buffer
MOVE.L A0,A4 ; save it for later
MOVE.B #1,27(A0) ; set read only permission
MOVE.L DP,18(A0) ; set name pointer
MOVE (PS)+,22(A0) ; set vrefnum (working directory)
_HOpen
TST 16(A0)
BNE.S derror
_GetEOF ; get ...
MOVE.L 28(A0),36(A0) ; ... and set ...
MOVE.L 28(A0),-(PS) ; ... and hold the file size
MOVE.L (PS),D0 ; set block size = file size
_NewHandle
BMI.S derror
MOVE fsptr-base(BP),D0 ; get file stack pointer
LEA fstack-base(BP),A1 ; file stack address
MOVE.L A0,0(A1,D0.W) ; stash the handle at fstack+(fsptr)
_HLock
MOVE.L (A0),A0 ; get start addr of block
MOVE.L A0,TextO-base(BP) ; set buffer start
MOVE.L A0,D0 ; set buffer end ...
ADD.L (PS)+,D0
MOVE.L D0,TextE-base(BP) ; ... to start + size
MOVE.L A4,A0 ; retrieve fcb pointer
MOVE.L TextO-base(BP),32(A0) ; set read buffer addr in fcb
_Read ; read data from file ...
TST 16(A0) ; ... to scrap buffer
BNE.S derror
_Close
_DisposPtr
JMP go-base(BP) ; interpret scrap buffer
DError: MOVE 16(A0),-(PS)
_Close
_DisposPtr
JSR pquote-base(BP)
DC.B 5,'Disk:' ; print the error messsage
der: JSR dot-base(BP) ; report the error number
der1: JMP huh-base(BP)
; DC.B 3,'REZ' ; Return the handle to a resource
; DC.W load-theLink ; ( ID type -- handle t or f )
; Rez: CLR.L -(SP)
; MOVE.L (PS)+,-(SP)
; MOVE (PS)+,-(SP)
; _GetResource
; MOVE.L (SP)+,D0 ; nil handle means error
; BEQ.S gser2
; MOVE.L D0,-(PS)
; MOVE #-1,-(PS)
; RTS
DC.B 8,'?GE' ; "?GESTALT"
DC.W load-theLink ; ( d.selector -- d.response true or false )
QGestalt: ; false if 64K ROM or no _Gestalt or bad selector
; check for 64K ROM
MOVE #$A86E,D0 ; _InitGraf
_GetTrapAddress.newTool
MOVE.L A0,D1
MOVE #$AA6E,D0 ; _InitGraf AND $200
_GetTrapAddress.newTool
CMP.L A0,D1
BEQ.S gser1 ; 64KROM
; Check for gestalt
MOVE.W #$A89F,D0 ; _Unimplemented
_GetTrapAddress.newTool ; NGetTrapAddress
MOVE.L A0,D1
MOVE.W #$A1AD,D0 ; _Gestalt
_GetTrapAddress.newOS ; NGetTrapAddress
CMP.L A0,D1
BEQ.S gser1 ; no gestalt
; run gestalt
MOVE.L (PS)+,D0
_Gestalt
BNE.S gser2
MOVE.L A0,-(PS) ; return the result ... and ...
MOVE #-1,-(PS) ; return true
gsret: RTS
gser1: ADDQ.L #4,PS ; gestalt error
gser2: CLR -(PS) ; return false
RTS
DC.B 128+2,',S',0 ; ",S" compile a dnumber from ascii
DC.W qgestalt-theLink ; NOTE: 1 and only 1 space seperates
CommaS: MOVE.L A2,A0
MOVEQ #4,D0
@0: MOVE.B (IS)+,(A0)+
DBRA D0,@0
MOVE.L (A2),-(PS)
TST.B fcolon-base(BP)
BEQ.S gsret
JMP dlit-base(BP)
DC.B 64+9,'INT' ; "interpret"
DC.W commas-theLink
Interp: JMP main-base(BP)
RTS ; <- gotta have this for mcompile
DC.B 4,'ROO' ; "room" ( -- bytes )
DC.W interp-theLink
Room: MOVE.L A3,A0
_RecoverHandle ; use handle rather than pointer
_GetHandleSize
MOVE.L A3,A0 ; Bottom
ADDA.L D0,A0 ; + block size ...
SUBA.L A2,A0 ; - end of dictionary
MOVE A0,-(PS) ; = unused dictionary space
RTS
CSave: CLR -(SP) ; Room for which item number.
MOVE #259,-(SP) ; Resource ID of ALRT
CLR.L -(SP)
_Alert ; About Item
SUBQ #1,(SP)+ ; check which item dismissed.
BEQ.S save ; save if 'ok'
RTS
DC.B 4,'SAV' ; "save" ( -- ) save the dictionary
DC.W room-theLink
Save: JSR here-base(BP)
MOVE (PS)+,freePt-base(BP) ; save current DP
MOVE Dict,DictPt-base(BP) ; save current DictPt
BSR.S room
MOVE (PS),freesz-base(BP) ; save current headroom
BSR.S negate
BSR.S grow ; reduce headroom to 4 bytes
move.l a3,A0 ; bottom
_RecoverHandle ; get DICT's handle
CLR -(SP)
MOVE.L A0,-(SP) ; push 2, 1 for each operation
MOVE.L A0,-(SP)
_ChangedResource
_HomeResFile
_UpdateResFile ; write out the DICT
MOVE freesz-base(BP),-(PS)
Grow: JSR here-base(BP)
MOVE (PS)+,D1 ; hold rel DP in D1
MOVE.L IS,-(PS)
JSR torel-base(BP)
MOVE (PS)+,D2
MOVE.L (RS),-(PS)
JSR torel-base(BP)
JSR swapp-base(BP)
MOVEA.L expand-base(BP),A0
JMP (A0) ; JSR won't return here
DC.B 4,'>AB' ; ">abs" (to-abs)
DC.W save-theLink ; ( addr16 -- daddr32 )
toAbs: CLR.L D0
MOVE (PS)+,D0 ; pop rel addr
LEA 0(BP,D0.W),A0 ; calc as offset to base ...
MOVE.L A0,-(PS) ; ... and push
RTS
DC.B 64+6,'NEG' ; "negate" ( n -- -n )
DC.W toabs-theLink
negate: NEG (PS)
RTS
DC.B 5,'SPA' ; "space" ( -- ) emit a space
DC.W negate-theLink
space: MOVE.L #32,D0
bra.s emitcode
DC.B 4,'TYP' ; "type" ( rel.addr len -- )
DC.W space-theLink ; emit len characters from rel.addr
Type: MOVEM.L D3/D4,-(SP) ; don't trash registers!
MOVE (PS)+,D3 ; get character count
SUBQ #1,D3
MOVE (PS)+,D4 ; get string relative address
@0: MOVE.B 0(BP,D4.W),D0 ; get character byte
bsr.s emitcode ; print character byte
ADDQ #1,D4
DBRA D3,@0
MOVEM.L (SP)+,D3/D4 ; restore registers
rts
pQuote: ; runtime part of ."
MOVE.L (RS),-(PS) ; push the addr of the string
JSR torel-base(BP)
ADDQ #1,(PS) ; skip the length byte
MOVE.L (RS),A0
CLR.L D0 ; clear the character count
MOVE.B (A0),D0 ; get the length
MOVE D0,-(PS) ; push it
ADDQ #2,D0
ANDI #$FFFE,D0 ; be sure its even
ADD.L D0,(RS) ; skip over string upon return
bra.s type ; type the string
DC.B 4,'EMI' ; "emit" ( n -- ) send the ascii
DC.W type-theLink ; to the terminal
Emit: MOVE (PS)+,D0
EmitCode: ; Emit contents of D0
CMP.B #13,D0 ; is it a <cr>
BEQ.S doCR
CMP.B #8,D0 ; is it a <del>?
BEQ.S doDEL
ANDI #$FF,D0
MOVE D0,-(A7)
_DrawChar
BSR.S penh
MOVE WContRect+6-base(BP),D0 ; right coord of WContRect
CMP D0,D1 ; is the position beyond the edge
BLS.S emitr ; no
doCR: PEA Scratch-base(BP)
_GetPen
MOVE Scratch-base(BP),D1
MOVE WContRect+4-base(BP),D0 ; bottom coord of WContRect
SUB #11,D0
CMP D0,D1 ; is the position below the window
BLS.S @0 ; no
; yes it is below the bottom of the window, so scroll up 11 pixels
CLR.L -(A7) ; Make room for a region handle.
_NewRgn ; get handle into (A7)
PEA WContRect-base(BP) ; rect to scroll
CLR -(A7) ; no horiz.
MOVE #$FFF5,-(A7) ; 11 pix. vert.
MOVE.L 8(A7),-(A7) ; push the region handle
_ScrollRect
_DisposRgn
MOVE WContRect+4-base(BP),D1 ; bottom coord of WContRect
SUBQ #4,D1
BRA.S @1
@0: ADD #11,D1 ; Add line height to pen location
@1: MOVE #1,-(A7)
MOVE D1,-(A7)
_MoveTo
emitr: RTS
doDEL: BSR.S penh
CMP #6,D1 ; first column?
blt.s @0 ; don't beep anymore
SUB #6,D1 ; back up
MOVE D1,-(SP)
MOVE Scratch-base(BP),-(SP)
_MoveTo
@0: RTS
penh: PEA Scratch-base(BP)
_GetPen
MOVE Scratch+2-base(BP),D1
RTS
DC.B 6,'EXP' ; "expect" ( addr count -- )
DC.W emit-theLink
Expect: MOVEM.L D4/IS,-(SP)
JSR swapp-base(BP) ; leave number of chars on stack
MOVE (PS)+,D0 ; addr
LEA 0(BP,D0.W),IS ; set IS to the input address
CLR Counter
MOVE (PS)+,D4
@0: JSR key-base(BP)
MOVE (PS)+,D5
CMPI #CR,D5 ; if key = CR
BNE.S @1
MOVE.B #BL,0(IS,Counter)
CLR.B 1(IS,Counter)
MOVE.B #BL,2(IS,Counter)
BRA.S @3
@1: CMPI #BS,D5 ; if key = backspace
BNE.S @2
TST Counter ; do nothing if first key is BS
BEQ.S @0
SUBQ #1,Counter ; decriment counter
bSR.s dodel ; -base(BP)
JSR space-base(BP) ; ... rubout char
bSR.s dodel ; -base(BP)
BRA.S @0
@2: MOVE.B D5,0(IS,Counter) ; stash the key into input buffer
ADDQ #1,Counter
MOVE D5,D0
JSR emitcode-base(BP)
CMP D4,Counter ; is count=number of chars to get?
BNE.S @0
@3: JSR docr-base(BP)
MOVEM.L (SP)+,D4/IS
RTS
DC.B 64+1,'0',0,0 ; "0" ( -- 0 )
DC.W expect-theLink
Zero: CLR -(PS)
RTS
DC.B 64+4,'DRO' ; "drop" ( n -- )
DC.W zero-theLink
drop: ADDQ.L #2,PS
RTS
DC.B 4,'SWA' ; "swap" ( n1 n2 -- n2 n1 )
DC.W drop-theLink
swapp: MOVE.L (PS)+,D0
SWAP D0
MOVE.L D0,-(PS)
RTS
DC.B 64+5,'2DR' ; "2drop" ( d -- )
DC.W swapp-theLink
TwoDrop:
ADDQ.L #4,PS
RTS
DC.B 4,'NUL' ; "null" ( -- )
DC.W twodrop-theLink
Null: RTS
dc.b 4,'WAR' ; "warm" ( ? -- )
dc.w null-theLink ; added 6/1/93
WarmSt: jmp warm-base(bp)
DC.B 6,'FOR' ; "forget" ( -- ) forgets dictionary
DC.W warmst-theLink
Forget: JSR tick-base(BP)
MOVE (PS)+,D0
MOVE -2(BP,D0.W),Dict
LEA -6(BP,D0.W),DP
RTS
DC.B 8,'CON' ; "constant" compile: ( n16 -- )
DC.W forget-theLink ; runtime: ( -- n16 )
Const: JSR token-base(BP) ; make a header for the next token
JSR header-base(BP)
JSR marco-base(BP) ; to return a constant
JSR literal-base(BP) ; compile time comma, runtime push
MOVE #$4E75,(DP)+ ; compile rts
RTS
DC.B 6,'CRE' ; "create" compile: ( -- )
DC.W const-theLink ; runtime: ( -- addr16 )
Create: JSR token-base(BP) ; give token this runtime action:
JSR header-base(BP)
MOVE #$3D3C,(DP)+ ; • move #nnnn,-(ps)
JSR here-base(BP)
ADDQ #6,(PS)
MOVE (PS)+,(DP)+ ; supply the nnnn from above
MOVE #$4EEB,(DP)+ ; • jmp null-base(bp)
MOVE.L DP,DoesAddr-base(BP) ; set DoesAddr to this "null"
MOVE #null-base,(DP)+
RTS
DC.B 5,'DOE' ; "does>" ( -- ) (use after create)
DC.W create-theLink ; set runtime action
Does: MOVE.L (RS)+,D0 ; pop the return address
SUB.L BP,D0 ; convert to rel.addr
MOVE.L DoesAddr-base(BP),A0 ; load jmp d(bp) address from create
MOVE D0,(A0) ; and stash rel.addr into it
RTS ; returns same as ;
DC.B 5,'ALL' ; "allot" ( n16 -- )
DC.W does-theLink ; compiles nada into the dictionary
Allot: ADDQ #1,(PS)
ANDI #$FFFE,(PS) ; make it even!
ADDA (PS)+,DP ; increment the dictionary pointer
RTS
DC.B 8,'VAR' ; "variable" compile: ( -- )
DC.W allot-theLink ; runtime: ( -- addr16 )
Variable:
JSR token-base(BP) ; give token this runtime action:
JSR header-base(BP)
JSR marco-base(BP) ; Sun May 1, 1988 04:24:44
MOVE #$3D3C,(DP)+ ; • move #nnnn,-(ps)
JSR here-base(BP)
ADDQ #4,(PS) ; calculate nnnn
MOVE (PS)+,(DP)+ ; • (this is the nnnn)
MOVE #$4E75,(DP)+ ; • rts
ADDQ.L #2,DP ; 2 allot
RTS
DC.B 3,'AE:'
DC.W variable-theLink
aColon: MOVE #AEvents-base,-(PS)
@0: JSR at-base(BP)
ADDI #10,(PS)
MOVE (PS),-(PS)
JSR at-base(BP)
TST (PS)+
BNE.S @0
MOVE (PS)+,D1
MOVE.L A2,D0
SUB.L BP,D0
MOVE D0,0(BP,D1.W)
MOVE.L (PS)+,(A2)+
MOVE.L (PS)+,(A2)+
LEA 4(A2),A0
SUBA.L A3,A0
MOVE A0,(A2)+
CLR (A2)+
MOVE #$4EBA,(A2)+
MOVE #aepre-base,-(PS)
JSR back-base(BP)
JMP rbrack-base(BP)
DC.B 128+3,';AE'
DC.W acolon-theLink
semiae: MOVE #$4EAB,(A2)+ ; • jsr aepost(bp)
MOVE #aepost-base,(A2)+ ; • rts
JMP semi-base(BP)
DC.B 64+5,'>NA' ; ">name" ( 'addr -- name.addr )
DC.W semiae-theLink
toname: SUBQ #6,(PS)
RTS
DC.B 64+5,'>LI' ; ">link" ( 'addr -- link.addr )
DC.W toname-theLink
tolink: SUBQ #2,(PS)
RTS
DC.B 3,'ID.' ; "id." ( addr -- )
DC.W tolink-theLink
IDDot: JSR toname-base(BP)
MOVEA.L DP,A0
MOVEQ.L #5,D0
@0: MOVE.L #$C9C9C9C9,(A0)+
DBRA D0,@0
MOVE (PS)+,D0
MOVE.L 0(BP,D0.W),(DP)
JSR here-base(BP)
MOVE (PS),-(PS)
JSR cat-base(BP)
ANDI #$1F,(PS) ; look at 5 lsb's
ADDQ #1,2(PS)
JSR type-base(BP)
JMP space-base(BP)
DC.B 5,'WOR' ; "words" ( -- ) list words
DC.W iddot-theLink
Words: MOVE.L D3,-(SP) ; preserve register
MOVE Dict,D3 ; start with the last word defined
@0: MOVE D3,-(PS) ; push the name address
ADDQ #6,(PS) ; get the CFA
BSR.S iddot ; print the name
MOVE 4(BP,D3.W),D3 ; put the next name addr into D3
TST.B 1(BP,D3.W) ; Quit if name is 0
BEQ.S @1 ; do next word if not=0
JSR qterm-base(BP)
TST (PS)+
BEQ.S @0
@1: MOVE.L (SP)+,D3 ; restore register
RTS
DC.B 3,'PAD' ; "pad" ( -- ) conversion pad
DC.W words-theLink
Pad: JSR here-base(BP)
ADDI #40,(PS) ; pad is 40 bytes from HERE.
RTS
DC.B 4,'HOL' ; "hold" ( c -- ) place c at ...
DC.W pad-theLink ; ... addr in Held.
Hold: SUBQ #1,held-base(BP)
MOVE held-base(BP),-(PS)
JMP cstore-base(BP)
DC.B 4,'SIG' ; "sign" ( sf dval -- dval )
DC.W hold-theLink
Sign: JSR rote-base(BP)
TST (PS)+
BGE.S @0
MOVE #'-',-(PS)
BSR.S hold
@0: RTS
DC.B 4,'DAB' ; "dabs" ( dval -- |dval| )
DC.W sign-theLink
Dabs: TST (PS)
BGE.S @0
JSR dneg-base(BP)
@0: RTS
DC.B 2,'<#',0 ; "<#" ( -- )
DC.W dabs-theLink
LSharp: BSR.S pad
MOVE (PS)+,held-base(BP)
MOVEA.L DP,A0
MOVE #9,D0
@0: CLR.L (A0)+
DBRA D0,@0
MOVE #30,-(PS)
BRA.S hold
DC.B 2,'#>'.0 ; "#>" ( dval -- addr len )
DC.W lsharp-theLink
SharpG: ADDQ.L #2,PS
MOVE held-base(BP),(PS)
BSR.S pad
MOVE 2(PS),-(PS) ; over
ADDQ #1,(PS)
JMP minus-base(BP)
DC.B 1,'#',0,0 ; "#" ( dval -- d/base )
DC.W sharpg-theLink
Sharp: MOVE NBase-base(BP),-(PS)
JSR msmod-base(BP)
JSR rote-base(BP)
CMPI #9,(PS) ; is top of stack < 9?
BLE.S @0
ADDQ #7,(PS)
@0: ADDI #48,(PS)
JMP hold-base(BP)
DC.B 2,'#S',0 ; "#s" ( dval -- 0 0 )
DC.W sharp-theLink
Sharps: BSR.S sharp
TST.L (PS)
BNE.S sharps
RTS
DC.B 2,'D.',0 ; "d." ( dval -- )
DC.W sharps-theLink
DDot: JSR swapp-base(BP)
MOVE 2(PS),-(PS)
JSR dabs-base(BP)
BSR.S lsharp
BSR.S sharps
JSR sign-base(BP)
BSR.S sharpg
jsr type-base(BP)
jmp space-base(bp)
DC.B 2,'U.',0 ; "u." ( uval -- )
DC.W ddot-theLink
UDot: CLR -(PS)
BRA.S ddot
DC.B 3,'S>D' ; "s>d" ( n -- d )
DC.W udot-theLink
SToD: MOVE (PS),-(PS) ; dup
JMP zerolt-base(BP) ; 0<
DC.B 1,'.',0,0 ; "." ( n -- )
DC.W stod-theLink
Dot: BSR.S stod
BRA.S ddot
DC.B 130,'."',0 ; "."" ( -- ) compiler part of (.")
DC.W dot-theLink
dotQ: MOVE #pQuote-base,-(PS)
JSR compile-base(BP) ; compile a call to (.")
JSR here-base(BP) ; ( -- addr )
MOVE #'"',-(PS) ; ( -- addr 34 )
JSR word-base(BP) ; ( -- addr )
JSR cat-base(BP) ; ( -- count )
ADDQ #1,(PS) ; ( -- count+1 )
JMP allot-base(BP) ; enclose the string in dictionary
DC.B 129,'(',0,0 ; "(" ( -- ) begin comment
DC.W dotq-theLink
Comment CMPI.B #41,(IS)+ ; read in characters until ")"
BNE.S Comment
RTS
DC.B 5,'CMO' ; "cmove" ( addr1 addr2 len -- )
DC.W comment-theLink ; from figFORTH, fixed 8/3/91
CMove: MOVE (PS)+,D0 ; D0 = length
MOVE (PS)+,D1
LEA 0(BP,D1.W),A1 ; A1 = addr2
MOVE (PS)+,D1
LEA 0(BP,D1.W),A0 ; A0 = addr1
CMPA.L A0,A1
BPL.S @2
BRA.S @1 ; addr1 > addr2
@0: MOVE.B (A0)+,(A1)+
@1: DBRA D0,@0
RTS
@2: ADDA D0,A0 ; addr1 ≤ addr2
ADDA D0,A1
BRA.S @4
@3: MOVE.B -(A0),-(A1)
@4: DBRA D0,@3
RTS
DC.B 4,'FIL' ; "fill" ( addr count char -- )
DC.W cmove-theLink
Fill: MOVE (PS)+,D0 ; character
MOVE (PS)+,D1 ; count
SUBQ #1,D1 ; decrement count
MOVE (PS)+,A0 ; relative addr
LEA 0(BP,A0.W),A0 ; get absolute addr
@0: MOVE.B D0,0(A0,D1.W) ; put char into addr + count
DBRA D1,@0 ; decrement count & loop until 0
RTS
DC.B 9,'-TR' ; "-trailing"
DC.W fill-theLink ; ( addr count -- addr new.count )
dtrail: MOVE (PS)+,D1 ; get the count
MOVE (PS),D0 ; get the rel.addr
LEA 0(BP,D0.W),A0 ; get the abs.addr
@0: CMPI.B #$20,-1(A0,D1.W) ; BEGIN is char at addr+count $20
DBNE D1,@0 ; NOT UNTIL
MOVE D1,-(PS) ; put new count on stack
RTS
DC.B 64+2,'1+',0 ; "1+" ( n -- n+1 )
DC.W dtrail-theLink
OnePl: ADDQ #1,(PS)
RTS
DC.B 64+2,'1-',0 ; "1-" ( n -- n-1 )
DC.W onepl-theLink
OneMi: SUBQ #1,(PS)
RTS
DC.B 64+2,'2+',0 ; "2+" ( n -- n+2 )
DC.W onemi-theLink
TwoPl: ADDQ #2,(PS)
RTS
DC.B 64+2,'2*',0 ; "2*" ( n -- n*2 )
DC.W twopl-theLink
ToStar: ASL (PS)
RTS
DC.B 64+2,'2/',0 ; "2/" ( n -- n/2 )
DC.W tostar-theLink
ToDiv: ASR (PS)
RTS
DC.B 5,'DEP' ; "depth" ( -- n )
DC.W ToDiv-theLink ; 16 bit entries on stack before this
depth: move.l szero-base(bp),d0
sub.l ps,d0
move d0,-(ps)
bra.s todiv
DC.B 1,'@',0,0 ; "@" (at) ( addr16 -- n16 )
DC.W depth-theLink
At: MOVE (PS),D0 ; DANGER: odd values crash this
MOVE 0(BP,D0.W),(PS)
RTS
DC.B 1,'!',0,0 ; "!" (store) ( n16 addr16 -- )
DC.W at-theLink
Store: MOVE (PS)+,D0 ; DANGER: odd values crash this
MOVE (PS)+,0(BP,D0.W)
RTS
DC.B 2,'C!',0 ; "c!" (sea-store)( n8 addr16 -- )
DC.W store-theLink
CStore: MOVE (PS)+,D0 ; get the rel.addr (odd OK)
ADDQ.L #1,PS ; align the stack
MOVE.B (PS)+,0(BP,D0.W) ; put data at the addr
RTS
DC.B 2,'C@',0 ; "c@" (sea-at) ( addr16 -- n8 )
DC.W cstore-theLink
CAt: MOVE (PS),D0 ; get rel.addr (odd OK)
CLR (PS) ; clear the result
MOVE.B 0(BP,D0.W),1(PS) ; stash the second byte
RTS
DC.B 64+2,'L@',0 ; "l@" (el-at) ( daddr32 -- n16 )
DC.W cat-theLink
LAt: MOVEA.L (PS)+,A0 ; get the double number "real" addr
MOVE (A0),-(PS) ; fetch the contents
RTS
DC.B 64+2,'L!',0 ; "l!" (el-store)( n16 daddr32 -- )
DC.W lat-theLink
LStore: MOVEA.L (PS)+,A0
MOVE (PS)+,(A0)
RTS
DC.B 64+3,'DL@' ; "dl@" ( daddr32 -- d32 )
DC.W lstore-theLink
DLAt: MOVEA.L (PS),A0
MOVE.L (A0),(PS)
RTS
DC.B 64+3,'DL!' ; "dl!" ( d32 daddr32 -- )
DC.W dlat-theLink
DLStor: MOVE.L (PS)+,A0
MOVE.L (PS)+,(A0)
RTS
DC.B 2,'+!',0 ; "+!" ( n16 addr16 -- )
DC.W DLStor-theLink
pstore: MOVE (PS)+,D0
MOVE (PS)+,D1
ADD D1,0(BP,D0.W)
RTS
DC.B 64+4,'CBL' ; "cblk" ( -- addr ) of fint
DC.W pstore-theLink
cBLK: MOVE #fint-base,-(PS)
RTS
DC.B 64+6,'CST' ; "cstate" ( -- addr ) of fcolon
DC.W cblk-theLink
cState: MOVE #fcolon-base,-(PS)
RTS
DC.B 64+4,'BAS' ; "base" ( -- addr )
DC.W cstate-theLink ; variable for the numeric radix
BaseA: MOVE #nbase-base,-(PS)
RTS
DC.B 64+3,'TIB' ; "tib" ( -- addr )
DC.W basea-theLink ; variable for Terminal Input Buf.
TIB: MOVE #termbuf-base,-(PS)
RTS
DC.B 64+6,'LAT' ; "latest" ( -- addr )
DC.W tib-theLink ; variable for the last dict word
Latest: MOVE Dict,-(PS) ; push contents of the dict register
RTS
DC.B 64+3,'R0@' ; "r0@" ( -- dabs.addr )
DC.W latest-theLink ; dabs.addr of r0
R0at: MOVE.L rzero-base(BP),-(PS)
RTS
DC.B 64+3,'RP@' ; "rp@" ( -- dabs.addr )
DC.W r0at-theLink ; current addr of the return stack
RPat: MOVE.L RS,-(PS)
RTS
DC.B 64+3,'S0@' ; "s0@" ( -- dabs.addr )
DC.W rpat-theLink ; dabs.addr of s0
S0at: MOVE.L szero-base(BP),-(PS)
RTS
DC.B 64+3,'SP@' ; "sp@" ( -- dabs.addr )
DC.W s0at-theLink ; address of the current stack cell
SPat: MOVE.L PS,-(PS)
RTS
DC.B 3,'HEX' ; "hex" ( -- )
DC.W spat-theLink
hex: MOVE #$10,nbase-base(BP)
RTS
DC.B 7,'DEC' ; "decimal" ( -- )
DC.W hex-theLink
decimal MOVE #10,nbase-base(BP)
RTS
DC.B 4,'?DU' ; "?dup" ( n -- n n OR n [if n=0] )
DC.W decimal-theLink
qdup: TST (PS)
BNE.S dup
RTS
DC.B 64+3,'DUP' ; "dup" ( n -- n n )
DC.W qdup-thelink
dup: MOVE (PS),-(PS)
RTS
DC.B 64+4,'OVE' ; "over" ( n1 n2 -- n1 n2 n1 )
DC.W dup-theLink
over: MOVE 2(PS),-(PS)
RTS
DC.B 3,'ROT' ; "rot" ( n1 n2 n3 -- n2 n3 n1 )
DC.W over-theLink
rote: MOVE.L (PS)+,D0
MOVE (PS)+,D1
MOVE.L D0,-(PS)
MOVE D1,-(PS)
RTS
DC.B 64+4,'2DU' ; "2dup" ( n1 n2 -- n1 n2 n1 n2 )
DC.W rote-theLink
todup: MOVE.L (PS),-(PS)
RTS
DC.B 5,'2SW' ; "2swap"
DC.W todup-theLink ; ( n1 n2 n3 n4 -- n3 n4 n1 n2 )
toswap: MOVE.L (PS)+,D0
MOVE.L (PS)+,D1
MOVE.L D0,-(PS)
MOVE.L D1,-(PS)
RTS
DC.B 64+2,'>R',0 ; ">r" ( n -- ) rstack: ( -- n16 )
DC.W toswap-theLink
toR: MOVE (PS)+,-(RS)
RTS
DC.B 64+2,'R>',0 ; "r>" ( -- n ) rstack: ( n16 -- )
DC.W tor-theLink
Rfrom: MOVE (RS)+,-(PS)
RTS
DC.B 64+1,'R',0,0 ; "r" ( -- n ) rs: ( n16 -- n16 )
DC.W rfrom-theLink
Are: MOVE (RS),-(PS)
RTS
DC.B 4,'EXI' ; "exit" ( -- ) drops return address
DC.W are-theLink
Exit: ADDQ.L #4,RS
RTS
DC.B 1,'*',0,0 ; "*" ( n1 n2 -- n1*n2 )
DC.W exit-theLink
times: MOVE (PS)+,D0
MULS (PS)+,D0
MOVE D0,-(PS)
RTS
DC.B 4,'/MO' ; "/mod ( n1 n2 -- rem quot )
DC.W times-theLink
Smod: MOVE (PS)+,D0
BNE.S @0
BRA.S sfail
@0: MOVE (PS)+,D1
EXT.L D1
DIVS D0,D1
SWAP D1
MOVE.L D1,-(PS)
RTS
DC.B 1,'/',0,0 ; "/" ( n1 n2 -- quotient )
DC.W smod-theLink
Slash: bsr.s smod
JSR swapp-base(BP)
ADDQ.L #2,PS
RTS
DC.B 3,'MOD' ; "mod" ( n1 n2 -- remainder )
DC.W slash-theLink
mod: bsr.s smod
ADDQ.L #2,PS
RTS
DC.B 2,'*/',0 ; "*/" ( n1 n2 n3 -- n1*n2/n3 )
DC.W mod-theLink
SSlash: MOVE (PS)+,D1
BNE.S sok
ADDQ.L #2,PS
sfail: MOVE #-1,(PS)
RTS
sok: MOVE (PS)+,D0
MULS (PS),D0
DIVS D1,D0
MOVE D0,(PS)
RTS
DC.B 2,'U*',0 ; "u*" ( n1 n2 -- d32 )
DC.W sslash-theLink
UStar: MOVE (PS)+,D0
MULU (PS)+,D0
MOVE.L D0,-(PS)
RTS
DC.B 5,'M/M' ; "m/mod" from King&Knight
DC.W ustar-theLink ; ( num32 denom16 -- rem16 quot32 )
MSMod: TST (PS) ; test for div by zero
BNE.S @0
ADDQ.L #4,PS
BRA.S sfail
@0: MOVE.L D2,-(SP) ; save D2
MOVEQ #0,D2 ; clear it
MOVE (PS)+,D2 ; pop denom into D2.W
MOVE.L (PS)+,D1 ; pop num into D1.L
MOVE D1,-(SP) ; hold num.l on rstack
CLR D1
SWAP D1
DIVU D2,D1
MOVE D1,D0
MOVE (SP)+,D1
DIVU D2,D1
SWAP D1
MOVE D1,-(PS) ; push remainder
MOVE D0,D1
SWAP D1
MOVE.L D1,-(PS) ; push quotient
MOVE.L (SP)+,D2 ; restore register
RTS
DC.B 64+7,'DNE' ; "dnegate" ( d32 -- -d32 )
DC.W msmod-theLink
DNeg: NEG.L (PS)
RTS
DC.B 64+2,'D+',0 ; "d+" ( d1 d2 -- d1+d2 )
DC.W dneg-theLink
DPlus: MOVE.L (PS)+,D0
ADD.L D0,(PS)
RTS
DC.B 128+2,'IF',0 ; "if" ( flag -- ) at runtime
DC.W dplus-theLink ; ( -- addr ) at compile time
pIf: MOVE.L #$4A5E6700,(DP)+ ; compile tst (ps)+ beq ...
pi1: bsr.s pbegin
ADDQ.L #2,DP ; make room for offset
RTS
DC.B 128+5,'WHI' ; "while" ( flag -- ) at runtime
DC.W pif-theLink ; ( -- addr ) at compile time
pWhile: BRA.S pIf
DC.B 128+4,'ELS' ; "else" ( -- ) at runtime
DC.W pwhile-theLink ; ( addr -- addr ) at compile time
pElse: MOVE #$6000,(DP)+
bsr.s pi1
JSR swapp-base(BP)
BRA.S pthen
DC.B 128+4,'THE' ; "then" ( -- ) at runtime
DC.W pelse-theLink ; ( addr -- ) at compile time
pThen: bsr.s pbegin
MOVE 2(PS),-(PS) ; over
JSR minus-base(BP)
JSR swapp-base(BP)
JMP store-base(BP)
DC.B 128+6,'REP' ; "repeat" ( -- ) at runtime
DC.W pthen-theLink ; ( b.addr w.addr -- ) at c.time
pRepet: MOVE #$6000,(DP)+ ; compile bra ...
JSR swapp-base(BP)
BSR.S back
BRA.S pThen ; HERE OVER - SWAP ! ;
DC.B 128+5,'BEG' ; "begin" ( -- ) at runtime
DC.W prepet-theLink ; ( -- addr ) at compile time
pBegin: JMP here-base(BP)
DC.B 128+5,'UNT' ; "until" ( flag -- ) at runtime
DC.W pbegin-theLink ; ( addr -- ) at compile time
pUntil MOVE.L #$4A5E6700,(DP)+ ; compile tst (ps)+ beq ...
BRA.S back
DC.B 128+5,'AGA' ; "again" ( -- ) at runtime
DC.W puntil-theLink ; ( addr -- ) at compile time
pAgain: MOVE #$6000,(DP)+ ; compile bra ...
BRA.S back
DC.B 4,'BAC' ; "back" ( addr -- )
DC.W pagain-theLink ; compile negative displacement
back: bsr.s pbegin
JSR minus-base(BP)
MOVE (PS),D0 ; get the target addr into d0
BGE.S @0
NEG D0 ; make it positive
@0: ANDI #$FF80,D0 ; if > 1 byte
BEQ.S @1
JMP comma-base(BP) ; then comma it as a long branch
@1: MOVE.B 1(PS),-1(DP) ; else make it a short branch
JMP drop-base(BP)
DC.B 128+2,'DO',0 ; "do" ( -- addr ) at compile time
DC.W back-theLink ; ( limit index -- ) at runtime
do: MOVE #$2F1E,(DP)+ ; • move.l (ps)+,-(ps)
bra.s pbegin
DC.B 128+4,'LOO' ; "loop" ( -- ) at runtime
DC.W do-theLink ; ( addr -- ) at compile time
Loop: MOVE.L #$52573017,(DP)+ ; • addq #1,(rs) (increment ix)
MOVE.L #$B06F0002,(DP)+ ; • move (rs),d0 (get ix)
MOVE #$6B00,(DP)+ ; • cmp 2(rs),d0 (check lim)
pl: BSR.S back ; • bmi ... (loop if ix<lim)
MOVE #$588F,(DP)+ ; comma in the displacement to 'do'
RTS ; • addq.l #4,rs (drop ix&lim)
DC.B 128+5,'+LO' ; "+loop" ( n -- ) at runtime
DC.W loop-theLink ; ( addr -- ) at compile time
pLoop: MOVE #$4EAB,(DP)+
MOVE #ppl-base,(DP)+ ; • jsr ppl-base(bp)
MOVE #$6700,(DP)+ ; • beq ... (neg flag change)
BRA.S pl
ppl: MOVE 4(A7),D0 ; get index
CMP 6(A7),D0 ; check limit
MOVE SR,D1 ; hold result
MOVE (PS)+,D0 ; get step
ADD D0,4(A7) ; incerment index
MOVE 4(A7),D0 ; get new index
CMP 6(A7),D0 ; check new limit
MOVE SR,D0 ; hold it
EOR D0,D1 ; mix with last result
AND #8,D1 ; check for change in neg flag
RTS
DC.B 5,'LEA' ; "leave" ( -- )
DC.W ploop-theLink ; set the index to the limit
Leave: MOVE 6(RS),4(RS)
RTS
DC.B 2,'0<',0 ; "0<" ( n -- flag )
DC.W leave-theLink
ZeroLT: TST (PS)
BLT.S true
false: CLR (PS)
RTS
true: MOVE #-1,(PS)
RTS
DC.B 2,'0>',0 ; "0>" ( n -- flag )
DC.W zerolt-theLink
ZeroGT: NEG (PS)
BRA.S zerolt
DC.B 2,'0=',0 ; "0=" ( n -- flag )
DC.W zerogt-theLink
ZeroEQ: TST (PS)
BEQ.S true
BRA.S false
DC.B 64+1,'+',0,0 ; "+" ( n1 n2 -- n1+n2 )
DC.W zeroeq-theLink
plus: MOVE (PS)+,D0
ADD D0,(PS)
RTS
DC.B 1,'-',0,0 ; "-" ( n1 n2 -- n1-n2 )
DC.W plus-theLink
minus: NEG (PS)
bra.s plus
DC.B 1,'=',0,0 ; "=" ( n1 n2 -- flag )
DC.W minus-theLink
equal: bsr.s minus
BRA.S zeroeq
DC.B 1,'<',0,0 ; "<" ( n1 n2 -- flag )
DC.W equal-theLink
lesst: bsr.s minus
BRA.S zerolt
DC.B 1,'>',0,0 ; ">" ( n1 n2 -- flag )
DC.W lesst-theLink
moret: bsr.s minus
BRA.S zerogt
DC.B 64+3,'AND' ; "and" ( n1 n2 -- n1(and)n2 )
DC.W moret-theLink
andd: MOVE (PS)+,D0
AND D0,(PS)
RTS
DC.B 64+2,'OR',0 ; "or" ( n1 n2 -- n1(or)n2 )
DC.W andd-theLink
orr: MOVE (PS)+,D0
OR D0,(PS)
RTS
DC.B 64+3,'XOR' ; "xor" ( n1 n2 -- n1(xor)n2 )
DC.W orr-theLink
xor: MOVE (PS)+,D0
EOR D0,(PS)
RTS
DC.B 3,'ABS' ; "abs" ( n1 -- abs(n1) )
DC.W xor-theLink
abs: TST (PS)
BGE.S @0
NEG (PS)
@0: RTS
DC.B 3,'MIN' ; "min" ( n1 n2 -- n(min) )
DC.W abs-theLink
min: MOVE (PS)+,D0
CMP (PS),D0
BLT.S pd0
RTS
pd0: MOVE D0,(PS)
RTS
DC.B 3,'MAX' ; "max" ( n1 n2 -- n(max) )
DC.W min-theLink
max: MOVE (PS)+,D0
CMP (PS),D0
BGE.S pd0
RTS
DC.B 2,'2@',0 ; "2@" ( addr -- d )
DC.W max-theLink ; 32 bit fetch
TwoAt: MOVE (PS)+,D0
MOVE.L 0(BP,D0.W),-(PS)
RTS
DC.B 2,'2!',0 ; "2!" ( d addr -- )
DC.W twoat-theLink ; 32 bit store
TwoStore:
MOVE (PS)+,D0
MOVE.L (PS)+,0(BP,D0.W)
RTS
DC.B 9,'2CO' ; "2constant"
DC.W twostore-theLink ; defining: ( d -- )
TwoCon: JSR token-base(BP) ; executing: ( -- d )
JSR header-base(BP)
JSR dlit-base(BP)
MOVE #$4E75,(DP)+
RTS
DC.B 9,'2VA' ; "2variable"
DC.W twocon-theLink ; defining: ( -- )
TwoVar: JSR variable-base(BP) ; executing: ( -- addr )
ADDQ.L #2,DP
RTS
DC.B 64+3,'2>R' ; "2>r" ( d -- ) rstack: ( -- d )
DC.W twovar-theLink
TwoToR: MOVE.L (PS)+,-(RS)
RTS
DC.B 64+3,'2R>' ; "2r>" ( -- d ) rstack: ( d -- )
DC.W twotor-theLink
TwoRFrom:
MOVE.L (RS)+,-(PS)
RTS
DC.B 3,'A>R' ; "a>r" ( addr -- )
DC.W tworfrom-theLink ; rstack: ( -- dabs.addr )
AToR: JSR toabs-base(BP)
MOVE.L (SP)+,A0
MOVE.L (PS)+,-(SP)
JMP (A0)
DC.B 64+5,'2OV' ; "2over" ( d1 d2 -- d1 d2 d1 )
DC.W ator-theLink
TwoOver:
MOVE.L 4(PS),-(PS)
RTS
DC.B 4,'2RO' ; "2rot" ( d1 d2 d3 -- d2 d3 d1 )
DC.W twoover-theLink
TwoRot: MOVE.L (PS)+,D0
MOVE.L (PS)+,D1
MOVE.L (PS),A0
MOVE.L D1,(PS)
MOVE.L D0,-(PS)
MOVE.L A0,-(PS)
RTS
; floating point stack manipulation
DC.B 64+5,'FDR' ; FDROP ( n1 n2 n3 n4 n5 -- )
DC.W tworot-theLink
fdrop: ADDQ.L #6,PS
ADDQ.L #4,PS
RTS
DC.B 4,'FDU' ; FDUP ( n5 n4 n3 n2 n1 -- n5 n4 n3 n2 n1 n5 n4 n3 n2 n1 )
DC.W fdrop-theLink
fdup: LEA 10(PS),A0
MOVE.L -(A0),-(PS)
MOVE.L -(A0),-(PS)
MOVE.W -(A0),-(PS)
RTS
DC.B 5,'FSW' ; FSWAP ( f1 f2 -- f2 f1 )
DC.W fdup-theLink
fswap: LEA (PS),A0
LEA 10(PS),A1
MOVEQ #4,D1
@0: MOVE (A1),D0
MOVE (A0),(A1)+
MOVE D0,(A0)+
DBRA D1,@0
RTS
DC.B 5,'FPI' ; FPICK ( fn..f1 m|n≥m≥1 -- fn..f1 fm )
DC.W fswap-theLink
fpick: MOVE #$0A,-(PS)
JSR times-base(BP)
MOVE (PS)+,D0
LEA 0(PS,D0.W),A0
MOVE.L -(A0),-(PS)
MOVE.L -(A0),-(PS)
MOVE -(A0),-(PS)
RTS
DC.B 5,'FPA' ; FPACK ( fn..f1 fnew m -- fn..f1 ) ( fm = fnew )
DC.W fpick-theLink
fpack: MOVE #$0A,-(PS)
JSR times-base(BP)
MOVE (PS)+,D0
LEA 0(PS,D0.W),A0
MOVE.L (PS)+,(A0)+
MOVE.L (PS)+,(A0)+
MOVE (PS)+,(A0)+
RTS
DC.B 5,'FRO' ; FROLL ( fn..f1 m -- fn..fm+1 fm-1..f1 fm )
DC.W fpack-theLink
froll: bsr.s fpick
lsr.w #1,d0
subq #1,d0
@0: MOVE -(A0),10(A0)
DBRA D0,@0
bsr.s fswap
JMP fdrop-base(BP)
; float - double number conversion
DC.B 3,'D>F' ; D>F ( d -- n1 n2 n3 n4 n5 )
DC.W froll-theLink
dtof: MOVE.L (PS)+,(DP)
MOVE.L DP,-(RS)
SUBQ.L #6,PS
SUBQ.L #4,PS
PEA (PS)
FL2X
RTS
DC.B 3,'F>D' ; F>D ( n1 n2 n3 n4 n5 -- d )
DC.W dtof-theLink
ftod: PEA (PS)
MOVE.L DP,-(RS)
FX2L
JSR fdrop-base(BP)
MOVE.L (DP),-(PS)
RTS
DC.B 2,'F@',0 ; F@ ( addr -- n5 n4 n3 n2 n1 )
DC.W ftod-theLink
fat: MOVE (PS)+,D0
LEA 10(BP,D0.W),A0
MOVE.L -(A0),-(PS)
MOVE.L -(A0),-(PS)
MOVE -(A0),-(PS)
RTS
DC.B 2,'F!',0 ; F! ( n5 n4 n3 n2 n1 addr -- )
DC.W fat-theLink
fstore: MOVE (PS)+,D0
LEA 0(BP,D0.W),A0
MOVE.L (PS)+,(A0)+
MOVE.L (PS)+,(A0)+
MOVE (PS)+,(A0)
RTS
DC.B 2,'F,',0 ; F, ( n5 n4 n3 n2 n1 -- )
DC.W fstore-theLink
fcomma: MOVE.L (PS)+,(DP)+
MOVE.L (PS)+,(DP)+
MOVE (PS)+,(DP)+
RTS
DC.B 9,'FCO' ; FCONSTANT ( comp: f -- ) ( run: -- f )
DC.W fcomma-theLink
fcon: JSR create-base(BP)
BSR.S fcomma
JSR does-base(BP)
BRA.S fat
DC.B 9,'FVA' ; FVARIABLE ( compile: -- ) ( run: -- addr )
DC.W fcon-theLink
fvar: JSR variable-base(BP)
ADDQ.L #8,DP
RTS
DC.B 3,'SCI' ; SCI ( decimal.places -- )
DC.W fvar-theLink
sci: CLR -(PS)
sci1: MOVE.L (PS)+,form-base(BP)
RTS
DC.B 3,'FIX' ; FIX ( decimal.places -- )
DC.W sci-theLink
fix: MOVE #$FFFF,-(PS)
BRA.S sci1
DC.B 2,'F.',0 ; F. ( n5 n4 n3 n2 n1 -- )
DC.W fix-theLink
fdot: PEA form-base(BP)
PEA (PS)
PEA $14(DP)
FX2DEC
JSR fdrop-base(BP)
PEA form-base(BP)
PEA $14(DP)
MOVE.L A2,-(RS)
FDEC2STR
dwrd: JSR here-base(BP)
JSR count-base(BP)
JSR type-base(BP)
JMP space-base(BP)
DC.B 8,'FCO' ; FCOMPARE ( f1 f2 -- f1 f2 [flag: -1|f1<f2 0|f1=f2 1|f1>f2] )
DC.W fdot-theLink
fcomp: MOVE #1,-(PS)
PEA 2(PS)
PEA 12(PS)
FCMPX
BGE.S @0
NEG (PS)
RTS
@0: BNE.S @1
CLR (PS)
@1: RTS
DC.B 2,'F+',0 ; F+ ( f1 f2 -- f1+f2 )
DC.W fcomp-theLink
fplus: PEA (PS)
PEA 10(PS)
FADDX
fd1: JMP fdrop-base(BP)
DC.B 2,'F-',0 ; F- ( f1 f2 -- f1-f2 )
DC.W fplus-theLink
fminus: PEA (PS)
PEA 10(PS)
FSUBX
BRA.S fd1
DC.B 2,'F*',0 ; F* ( f1 f2 -- f1*f2 )
DC.W fminus-theLink
fstar: PEA (PS)
PEA 10(PS)
FMULX
BRA.S fd1
DC.B 2,'F/',0 ; F/ ( f1 f2 -- f1/f2 )
DC.W fstar-theLink
fslash: PEA (PS)
PEA 10(PS)
FDIVX
BRA.S fd1
DC.B 4,'FRE' ; FREM ( f1 f2 -- rem[f1/f2] )
DC.W fslash-theLink
frem: PEA (PS)
PEA 10(PS)
FREMX
BRA.S fd1
DC.B 2,'F^',0 ; F^ ( f1 f2 -- f1^f2 )
DC.W frem-theLink
ftothe: PEA (PS)
PEA 10(PS)
FXPWRY
BRA.S fd1
DC.B 4,'FIN' ; FINT ( f -- int[f] )
DC.W ftothe-theLink
finte: PEA (PS)
FTINTX
RTS
DC.B 4,'FAB' ; FABS ( f -- |f| )
DC.W finte -theLink
fabs: PEA (PS)
FABSX
RTS
DC.B 5,'FSQ' ; FSQRT ( f -- sqrt[f] )
DC.W fabs-theLink
fsqrt: PEA (PS)
FSQRTX
RTS
DC.B 4,'FSI' ; FSIN ( f -- sin[f] )
DC.W fsqrt-theLink
fsin: PEA (PS)
FSINX
RTS
DC.B 4,'FCO' ; FCOS ( f -- cos[f] )
DC.W fsin-theLink
fcos: PEA (PS)
FCOSX
RTS
DC.B 4,'FTA' ; FTAN ( f -- tan[f] )
DC.W fcos-theLink
ftan: PEA (PS)
FTANX
RTS
DC.B 4,'FAT' ; FATN ( f -- atn[f] )
DC.W ftan-theLink
fatn: PEA (PS)
FATNX
RTS
DC.B 4,'FEX' ; FEXP ( f1 -- e^f1 )
DC.W fatn-theLink
fexp: PEA (PS)
FEXPX
RTS
DC.B 3,'FLN' ; FLN ( f1 -- ln[f1] )
DC.W fexp-theLink
fln: PEA (PS)
FLNX
RTS
DC.B 4,'@PE' ; "@pen" ( -- h v )
DC.W fln-theLink
AtPen: PEA (DP)
_GetPen
MOVE.L (DP),-(PS)
RTS
DC.B 64+4,'!PE' ; "!pen" ( h v -- )
DC.W atpen-theLink
SetPen: MOVE.L (PS)+,-(SP)
_MoveTo
RTS
DC.B 64+3,'-TO' ; "-to" ( h v -- )
DC.W setpen-theLink
LineTo: MOVE.L (PS)+,-(SP)
_LineTo
RTS
DC.B 64+5,'PMO' ; "pmode" ( mode -- )
DC.W lineto-theLink
PMode: MOVE (PS)+,-(SP)
_PenMode
RTS
DC.B 6,'@MO' ; "@mouse" ( -- h v )
DC.W pmode-theLink
AtMouse:
SUBQ.L #4,PS
PEA (PS)
_GetMouse
RTS
DC.B 4,'TAS' ; "task" ( -- ) a no-op word
DC.W AtMouse-theLink ; use: forget task : task ;
Task: RTS ; to cleanup dictionary
DictEnd: